package Sort_work;

import java.util.Arrays;

/**
 * 冒泡排序
 * 原理：比较相邻的元素 如果第一个比第二个大 就交换他们两个。
 *      每一趟都能确定一个最大元素
 * 时间复杂度：O(n^2)
 * 空间复杂度：O(1)
 * 稳定性：稳定（不加等号就稳定，加了等号就不稳定）
 */
public class Bubble_Sort {
    public static void bubbleSort(int[] array) {
        //其中 i指的是元素排序的次数
        //    j指的是参与排序的元素个数
        //为什么每次要减i？
        // 因为每排序一次，末尾都是数组中最大的元素，为了渐少时间复杂度，末尾元素不参与排序
        for (int i = 0; i < array.length - 1; i++) {
            for (int j = 0; j < array.length - i - 1; j++) {
                boolean flag = true;
                //如果后面的元素比前面的大，就交换两个元素
                if(array[j] > array[j+1]) {
                    int tmp = array[j];
                    array[j] = array[j+1];
                    array[j+1] = tmp;
                    flag = false;
                }
                //证明没交换了 可以提前结束
                if(!flag) {
                    break;
                }
            }
        }
    }
    //冒泡排序index次
    public static void bubbleSortIndex(int[] array, int index) {
        for (int i = 0; i < index; i++) {
            for (int j = 0; j < array.length - i - 1; j++) {
                //如果后面的元素比前面的大，就交换两个元素
                if(array[j] > array[j+1]) {
                    int tmp = array[j];
                    array[j] = array[j+1];
                    array[j+1] = tmp;
                }
            }
        }
    }
    public static void main(String[] args) {
        //初始化一个数组
        int[] array = {4,5,6,3,2,1};
        //Bubble(array);
        bubbleSortIndex(array,3);
        System.out.println(Arrays.toString(array));
    }
}
